package com.bdjk.bdmw.InfoGath.communication.dataProcess;

import java.text.ParseException;
import java.util.logging.Logger;

import com.bdjk.bdmw.InfoGath.common.constants.ProtocolConstants;
import com.bdjk.bdmw.InfoGath.common.vo.BaseVO;
import com.bdjk.bdmw.InfoGath.communication.persistence.ChooseService;
import com.bdjk.bdmw.InfoGath.communication.protocol.BaseProtocol;
import com.bdjk.bdmw.InfoGath.communication.protocol.ProtocolPool;

/**
 * @author hy
 * @description 数据处理流程类，主要对客户端上传的字符串进行判断、校验和解析 该类和通信线程只有3个交互点 1.
 *              从通信线程获取客户端的数据，进行校验、解析、入库 2. 告知通信线程当前收取的消息是否需要给客户端进行反馈 3.
 *              给通信线程需要反馈的消息
 */
public class DataProcess {

	
	
	// 协议
	public BaseProtocol protocol;
    // 消息对应的设备号
	public String terIdent;
	// 待处理的消息
	public String msg;

	// 是否需要应答
	public boolean isResponse;
	// 是否需要写入数据库
	public boolean isSave;

	// 响应消息
	public String responseMsg;
	
	// vo
	public BaseVO vo;

	// 当前信息对应的公司名字
	public String companyName;
	
	// 当前协议的正则表达式
	public String pattern;
	
	public void messageHandle(String msg) {
		System.out.println(msg);
		int startindex=msg.indexOf('[');
		int endindex=msg.indexOf(']');
		if(startindex==-1||endindex==-1) return;
		if(startindex+1>=endindex) return;
		this.msg=msg.substring(startindex+1,endindex);
		//this.msg = msg.substring(1,msg.length()-1);
		System.out.println(this.msg);
		this.chooseProtocol();
		if(null != this.protocol){
			this.verifyMsg();
			this.parseMsg();
			if(this.isResponse){
				this.getResponseMsg();
			}
			if(this.isSave){
				this.saveMessage();
			}
		}
	}
	
	/**
	 * 选择协议
	 */
	private void chooseProtocol() {
		// 选择协议
		ProtocolPool pool = new ProtocolPool();
		this.protocol = pool.chooseProtocol(msg);
		if(null != this.protocol){
			// 确认当前协议是否需要应答
			this.isResponse = protocol.isResponse;
			this.isSave=protocol.isSave;
			this.pattern=protocol.pattern;
		}
		// 通过协议确定公司名字
		
	}

	/**
	 * 校验协议是否完整正确
	 */
	private void verifyMsg() {

	}

	/**
	 * 解析协议
	 */
	private void parseMsg() {
		this.vo = (BaseVO) this.protocol.decodeMessage(msg);
		this.terIdent = this.protocol.terIdent;
	}

	/**
	 * 获取响应信息
	 * 
	 * @return
	 */
	public void getResponseMsg() {
		this.responseMsg=protocol.encodeMessage(this.vo);
	}

	public void saveMessage() {
		ChooseService service = new ChooseService();
		try {
			service.saveMessage(this.pattern,this.vo.vo2Model());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
